Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ

Node / meshtastic / Meshtastic-Android / files / .github / agents / speckit.tasks.agent.md

Displaying Rendered β€’ View raw β€’ Download

.github/agents/speckit.tasks.agent.md gh-readonly-queue/main/pr-6597-a885127337f8d0abf09f1f5537560ed7af85e32d (34896a4a) Text, 9.48 KB

description: Generate an actionable, dependency-ordered tasks.md for the feature based on available design artifacts.
handoffs:
β€’ label: Analyze For Consistency
agent: speckit.analyze
prompt: Run a project analysis for consistency
send: true
β€’ label: Implement Project
agent: speckit.implement
prompt: Start the implementation in phases
send: true

User Input

T282828
$ARGUMENTS

You MUST consider the user input before proceeding (if not empty).

Pre-Execution Checks

Check for extension hooks (before tasks generation):
β€’ Check if T383838.specify/extensions.yml exists in the project root.
β€’ If it exists, read it and look for entries under the T383838hooks.before_tasks key
β€’ If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
β€’ Filter out hooks where T383838enabled is explicitly T383838false. Treat hooks without an T383838enabled field as enabled by default.
β€’ For each remaining hook, do not attempt to interpret or evaluate hook T383838condition expressions:
β€’ If the hook has no T383838condition field, or it is null/empty, treat the hook as executable
β€’ If the hook defines a non-empty T383838condition, skip the hook and leave condition evaluation to the HookExecutor implementation
β€’ For each executable hook, output the following based on its T383838optional flag:
β€’ Optional hook (T383838optional: true):
T282828
## Extension Hooks

**Optional Pre-Hook**: {extension}
Command: \`/{command}\`
Description: {description}

Prompt: {prompt}
To execute: \`/{command}\`
β€’ Mandatory hook (T383838optional: false):
T282828
## Extension Hooks

**Automatic Pre-Hook**: {extension}
Executing: \`/{command}\`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the Outline.
β€’ If no hooks are registered or T383838.specify/extensions.yml does not exist, skip silently

Outline

1. Setup: Run T383838.specify/scripts/bash/setup-tasks.sh --json from repo root and parse FEATUREDIR, TASKSTEMPLATE, and AVAILABLE_DOCS list. T383838FEATURE_DIR and T383838TASKS_TEMPLATE must be absolute paths when provided. T383838AVAILABLE_DOCS is a list of document names/relative paths available under T383838FEATURE_DIR (for example T383838research.md or T383838contracts/). For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").

2. Load design documents: Read from FEATURE_DIR:
β€’ Required: plan.md (tech stack, libraries, structure), spec.md (user stories with priorities)
β€’ Optional: data-model.md (entities), contracts/ (interface contracts), research.md (decisions), quickstart.md (test scenarios)
β€’ Note: Not all projects have all documents. Generate tasks based on what's available.

3. Execute task generation workflow:
β€’ Load plan.md and extract tech stack, libraries, project structure
β€’ Load spec.md and extract user stories with their priorities (P1, P2, P3, etc.)
β€’ If data-model.md exists: Extract entities and map to user stories
β€’ If contracts/ exists: Map interface contracts to user stories
β€’ If research.md exists: Extract decisions for setup tasks
β€’ Generate tasks organized by user story (see Task Generation Rules below)
β€’ Generate dependency graph showing user story completion order
β€’ Create parallel execution examples per user story
β€’ Validate task completeness (each user story has all needed tasks, independently testable)

4. Generate tasks.md: Read the tasks template from TASKSTEMPLATE (from the JSON output above) and use it as structure. If TASKSTEMPLATE is empty, fall back to T383838.specify/templates/tasks-template.md. Fill with:
β€’ Correct feature name from plan.md
β€’ Phase 1: Setup tasks (project initialization)
β€’ Phase 2: Foundational tasks (blocking prerequisites for all user stories)
β€’ Phase 3+: One phase per user story (in priority order from spec.md)
β€’ Each phase includes: story goal, independent test criteria, tests (if requested), implementation tasks
β€’ Final Phase: Polish & cross-cutting concerns
β€’ All tasks must follow the strict checklist format (see Task Generation Rules below)
β€’ Clear file paths for each task
β€’ Dependencies section showing story completion order
β€’ Parallel execution examples per story
β€’ Implementation strategy section (MVP first, incremental delivery)

5. Report: Output path to generated tasks.md and summary:
β€’ Total task count
β€’ Task count per user story
β€’ Parallel opportunities identified
β€’ Independent test criteria for each story
β€’ Suggested MVP scope (typically just User Story 1)
β€’ Format validation: Confirm ALL tasks follow the checklist format (checkbox, ID, labels, file paths)

6. Check for extension hooks: After tasks.md is generated, check if T383838.specify/extensions.yml exists in the project root.
β€’ If it exists, read it and look for entries under the T383838hooks.after_tasks key
β€’ If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
β€’ Filter out hooks where T383838enabled is explicitly T383838false. Treat hooks without an T383838enabled field as enabled by default.
β€’ For each remaining hook, do not attempt to interpret or evaluate hook T383838condition expressions:
β€’ If the hook has no T383838condition field, or it is null/empty, treat the hook as executable
β€’ If the hook defines a non-empty T383838condition, skip the hook and leave condition evaluation to the HookExecutor implementation
β€’ For each executable hook, output the following based on its T383838optional flag:
β€’ Optional hook (T383838optional: true):
T282828
## Extension Hooks

**Optional Hook**: {extension}
Command: \`/{command}\`
Description: {description}

Prompt: {prompt}
To execute: \`/{command}\`
β€’ Mandatory hook (T383838optional: false):
T282828
## Extension Hooks

**Automatic Hook**: {extension}
Executing: \`/{command}\`
EXECUTE_COMMAND: {command}
β€’ If no hooks are registered or T383838.specify/extensions.yml does not exist, skip silently

Context for task generation: $ARGUMENTS

The tasks.md should be immediately executable - each task must be specific enough that an LLM can complete it without additional context.

Task Generation Rules

CRITICAL: Tasks MUST be organized by user story to enable independent implementation and testing.

Tests are OPTIONAL: Only generate test tasks if explicitly requested in the feature specification or if user requests TDD approach.

Checklist Format (REQUIRED)

Every task MUST strictly follow this format:

T282828
[ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path

Format Components:

1. Checkbox: ALWAYS start with T383838- [ ] (markdown checkbox)
2. Task ID: Sequential number (T001, T002, T003...) in execution order
3. [P] marker: Include ONLY if task is parallelizable (different files, no dependencies on incomplete tasks)
4. [Story] label: REQUIRED for user story phase tasks only
β€’ Format: [US1], [US2], [US3], etc. (maps to user stories from spec.md)
β€’ Setup phase: NO story label
β€’ Foundational phase: NO story label
β€’ User Story phases: MUST have story label
β€’ Polish phase: NO story label
5. Description: Clear action with exact file path

Examples:

β€’ βœ… CORRECT: T383838- [ ] T001 Create project structure per implementation plan
β€’ βœ… CORRECT: T383838- [ ] T005 [P] Implement authentication middleware in src/middleware/auth.py
β€’ βœ… CORRECT: T383838- [ ] T012 [P] [US1] Create User model in src/models/user.py
β€’ βœ… CORRECT: T383838- [ ] T014 [US1] Implement UserService in src/services/user_service.py
β€’ ❌ WRONG: T383838- [ ] Create User model (missing ID and Story label)
β€’ ❌ WRONG: T383838T001 [US1] Create model (missing checkbox)
β€’ ❌ WRONG: T383838- [ ] [US1] Create User model (missing Task ID)
β€’ ❌ WRONG: T383838- [ ] T001 [US1] Create model (missing file path)

Task Organization

1. From User Stories (spec.md) - PRIMARY ORGANIZATION:
β€’ Each user story (P1, P2, P3...) gets its own phase
β€’ Map all related components to their story:
β€’ Models needed for that story
β€’ Services needed for that story
β€’ Interfaces/UI needed for that story
β€’ If tests requested: Tests specific to that story
β€’ Mark story dependencies (most stories should be independent)

2. From Contracts:
β€’ Map each interface contract β†’ to the user story it serves
β€’ If tests requested: Each interface contract β†’ contract test task [P] before implementation in that story's phase

3. From Data Model:
β€’ Map each entity to the user story(ies) that need it
β€’ If entity serves multiple stories: Put in earliest story or Setup phase
β€’ Relationships β†’ service layer tasks in appropriate story phase

4. From Setup/Infrastructure:
β€’ Shared infrastructure β†’ Setup phase (Phase 1)
β€’ Foundational/blocking tasks β†’ Foundational phase (Phase 2)
β€’ Story-specific setup β†’ within that story's phase

Phase Structure

β€’ Phase 1: Setup (project initialization)
β€’ Phase 2: Foundational (blocking prerequisites - MUST complete before user stories)
β€’ Phase 3+: User Stories in priority order (P1, P2, P3...)
β€’ Within each story: Tests (if requested) β†’ Models β†’ Services β†’ Endpoints β†’ Integration
β€’ Each phase should be a complete, independently testable increment
β€’ Final Phase: Polish & Cross-Cutting Concerns

Served by rngit 1.5.2 - Generated in 0.04s